package cn.chengpengper.seckill.goods.application.service;


import cn.chengpengper.seckill.common.cache.model.SeckillBusinessCache;
import cn.chengpengper.seckill.common.model.dto.SeckillGoodsDTO;
import cn.chengpengper.seckill.common.model.message.TxMessage;
import cn.chengpengper.seckill.goods.application.command.SeckillGoodsCommand;
import cn.chengpengper.seckill.goods.model.entity.SeckillGoods;

import java.util.List;

/**
 * @author chengpeng.hu
 */
public interface SeckillGoodsService {

    /**
     * 保存商品信息
     *
     * @param seckillGoodsCommand 商品实体
     * @return 影响行数
     */
    void saveSeckillGoods(SeckillGoodsCommand seckillGoodsCommand);

    /**
     * 根据商品ID获取商品详情
     *
     * @param id 商品ID
     * @return 商品详情
     */
    SeckillGoods getSeckillGoodsId(Long id);

    /**
     * 根据秒杀活动ID获取商品列表
     *
     * @param activityId 秒杀活动ID
     * @return 商品列表
     */
    List<SeckillGoods> getSeckillGoodsByActivityId(Long activityId);

    /**
     * 更新商品状态
     *
     * @param status 商品状态
     * @param id     商品ID
     * @return 影响行数
     */
    void updateStatus(Integer status, Long id);

    /**
     * 扣减商品库存
     *
     * @param count 扣减数量
     * @param id    商品ID
     * @return 是否减少成功
     */
    boolean decAvailableStock(Integer count, Long id);

    /**
     * 扣减商品库存
     *
     * @param count 扣减数量
     * @param id    商品ID
     * @return 是否减少成功
     */
    boolean decDbAvailableStock(Integer count, Long id);

    boolean decDbAvailableStock(TxMessage message);

    /**
     * 获取商品可用库存
     *
     * @param id 商品ID
     * @return 库存数
     */
    Integer getAvailableStockById(Long id);

    /**
     * 根据活动ID和版本获取商品列表
     *
     * @param activityId 活动ID
     * @param version    版本
     * @return 商品列表
     */
    List<SeckillGoodsDTO> getSeckillGoodsList(Long activityId, Long version);

    /**
     * 根据ID和版本获取商品详情
     *
     * @param id      商品ID
     * @param version 版本
     * @return 商品详情
     */
    SeckillGoodsDTO getSeckillGoods(Long id, Long version);

    /**
     * 获取商品可用库存
     */
    SeckillBusinessCache<Integer> getAvailableStock(Long goodsId, Long version);

}
